/**
 * 设备检测模块 - 提供设备类型、浏览器、操作系统检测功能
 */

// 获取用户代理字符串
const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase() : '';

/**
 * 检测是否为移动设备
 * @returns {boolean} 是否为移动设备
 */
export function isMobile() {
  return /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(userAgent);
}

/**
 * 检测是否为平板设备
 * @returns {boolean} 是否为平板设备
 */
export function isTablet() {
  return /ipad|android(?!.*mobile)|tablet/i.test(userAgent);
}

/**
 * 检测是否为桌面设备
 * @returns {boolean} 是否为桌面设备
 */
export function isDesktop() {
  return !isMobile() && !isTablet();
}

/**
 * 检测是否为iOS设备
 * @returns {boolean} 是否为iOS设备
 */
export function isIOS() {
  return /iphone|ipad|ipod/i.test(userAgent);
}

/**
 * 检测是否为Android设备
 * @returns {boolean} 是否为Android设备
 */
export function isAndroid() {
  return /android/i.test(userAgent);
}

/**
 * 检测是否为Windows设备
 * @returns {boolean} 是否为Windows设备
 */
export function isWindows() {
  return /windows/i.test(userAgent);
}

/**
 * 检测是否为Mac设备
 * @returns {boolean} 是否为Mac设备
 */
export function isMac() {
  return /mac os x/i.test(userAgent);
}

/**
 * 检测是否为Linux设备
 * @returns {boolean} 是否为Linux设备
 */
export function isLinux() {
  return /linux/i.test(userAgent) && !isAndroid();
}

/**
 * 检测浏览器类型
 * @returns {Object} 浏览器信息
 */
export function getBrowser() {
  const browsers = [
    { name: 'Edge', pattern: /edg/i },
    { name: 'Chrome', pattern: /chrome/i },
    { name: 'Firefox', pattern: /firefox/i },
    { name: 'Safari', pattern: /safari/i },
    { name: 'Opera', pattern: /opera|opr/i },
    { name: 'IE', pattern: /msie|trident/i }
  ];

  for (const browser of browsers) {
    if (browser.pattern.test(userAgent)) {
      return {
        name: browser.name,
        version: getBrowserVersion(browser.name)
      };
    }
  }

  return {
    name: 'Unknown',
    version: '0'
  };
}

/**
 * 获取浏览器版本
 * @param {string} browserName 浏览器名称
 * @returns {string} 版本号
 */
function getBrowserVersion(browserName) {
  const patterns = {
    Edge: /edg\/([\d.]+)/i,
    Chrome: /chrome\/([\d.]+)/i,
    Firefox: /firefox\/([\d.]+)/i,
    Safari: /version\/([\d.]+)/i,
    Opera: /(?:opera|opr)\/([\d.]+)/i,
    IE: /(?:msie |rv:)([\d.]+)/i
  };

  const pattern = patterns[browserName];
  if (pattern) {
    const match = userAgent.match(pattern);
    return match ? match[1] : '0';
  }

  return '0';
}

/**
 * 检测操作系统
 * @returns {Object} 操作系统信息
 */
export function getOS() {
  const systems = [
    { name: 'iOS', pattern: /iphone|ipad|ipod/i },
    { name: 'Android', pattern: /android/i },
    { name: 'Windows', pattern: /windows nt ([\d.]+)/i },
    { name: 'macOS', pattern: /mac os x ([\d._]+)/i },
    { name: 'Linux', pattern: /linux/i }
  ];

  for (const system of systems) {
    const match = userAgent.match(system.pattern);
    if (match) {
      return {
        name: system.name,
        version: match[1] ? match[1].replace(/_/g, '.') : 'Unknown'
      };
    }
  }

  return {
    name: 'Unknown',
    version: 'Unknown'
  };
}

/**
 * 获取设备类型
 * @returns {string} 设备类型
 */
export function getDeviceType() {
  if (isMobile()) {
    return 'mobile';
  } else if (isTablet()) {
    return 'tablet';
  } else {
    return 'desktop';
  }
}

/**
 * 检测是否支持触摸
 * @returns {boolean} 是否支持触摸
 */
export function isTouchDevice() {
  return 'ontouchstart' in window ||
         navigator.maxTouchPoints > 0 ||
         navigator.msMaxTouchPoints > 0;
}

/**
 * 获取屏幕信息
 * @returns {Object} 屏幕信息
 */
export function getScreenInfo() {
  if (typeof window === 'undefined') {
    return {
      width: 0,
      height: 0,
      availWidth: 0,
      availHeight: 0,
      colorDepth: 0,
      pixelDepth: 0,
      devicePixelRatio: 1
    };
  }

  return {
    width: screen.width,
    height: screen.height,
    availWidth: screen.availWidth,
    availHeight: screen.availHeight,
    colorDepth: screen.colorDepth,
    pixelDepth: screen.pixelDepth,
    devicePixelRatio: window.devicePixelRatio || 1
  };
}

/**
 * 获取视口信息
 * @returns {Object} 视口信息
 */
export function getViewportInfo() {
  if (typeof window === 'undefined') {
    return {
      width: 0,
      height: 0
    };
  }

  return {
    width: Math.max(document.documentElement.clientWidth, window.innerWidth || 0),
    height: Math.max(document.documentElement.clientHeight, window.innerHeight || 0)
  };
}

/**
 * 检测是否为Retina显示器
 * @returns {boolean} 是否为Retina显示器
 */
export function isRetina() {
  if (typeof window === 'undefined') return false;
  return window.devicePixelRatio > 1;
}

/**
 * 检测网络连接状态
 * @returns {Object} 网络连接信息
 */
export function getNetworkInfo() {
  if (typeof navigator === 'undefined' || !navigator.connection) {
    return {
      online: typeof navigator !== 'undefined' ? navigator.onLine : true,
      type: 'unknown',
      effectiveType: 'unknown',
      downlink: 0,
      rtt: 0
    };
  }

  const connection = navigator.connection;
  return {
    online: navigator.onLine,
    type: connection.type || 'unknown',
    effectiveType: connection.effectiveType || 'unknown',
    downlink: connection.downlink || 0,
    rtt: connection.rtt || 0
  };
}

/**
 * 检测是否为微信浏览器
 * @returns {boolean} 是否为微信浏览器
 */
export function isWeChat() {
  return /micromessenger/i.test(userAgent);
}

/**
 * 检测是否为支付宝浏览器
 * @returns {boolean} 是否为支付宝浏览器
 */
export function isAlipay() {
  return /alipayclient/i.test(userAgent);
}

/**
 * 检测是否为QQ浏览器
 * @returns {boolean} 是否为QQ浏览器
 */
export function isQQ() {
  return /qq/i.test(userAgent) && !isWeChat();
}

/**
 * 检测是否为UC浏览器
 * @returns {boolean} 是否为UC浏览器
 */
export function isUC() {
  return /ucbrowser/i.test(userAgent);
}

/**
 * 获取设备像素比
 * @returns {number} 设备像素比
 */
export function getPixelRatio() {
  return typeof window !== 'undefined' ? (window.devicePixelRatio || 1) : 1;
}

/**
 * 检测是否支持WebP格式
 * @returns {Promise<boolean>} 是否支持WebP
 */
export function supportsWebP() {
  return new Promise((resolve) => {
    const webP = new Image();
    webP.onload = webP.onerror = () => {
      resolve(webP.height === 2);
    };
    webP.src = '';
  });
}

/**
 * 检测是否支持WebGL
 * @returns {boolean} 是否支持WebGL
 */
export function supportsWebGL() {
  try {
    const canvas = document.createElement('canvas');
    return !!(window.WebGLRenderingContext &&
             (canvas.getContext('webgl') || canvas.getContext('experimental-webgl')));
  } catch (e) {
    return false;
  }
}

/**
 * 获取完整的设备信息
 * @returns {Object} 设备信息
 */
export function getDeviceInfo() {
  return {
    // 设备类型
    deviceType: getDeviceType(),
    isMobile: isMobile(),
    isTablet: isTablet(),
    isDesktop: isDesktop(),
    isTouchDevice: isTouchDevice(),

    // 操作系统
    os: getOS(),
    isIOS: isIOS(),
    isAndroid: isAndroid(),
    isWindows: isWindows(),
    isMac: isMac(),
    isLinux: isLinux(),

    // 浏览器
    browser: getBrowser(),
    isWeChat: isWeChat(),
    isAlipay: isAlipay(),
    isQQ: isQQ(),
    isUC: isUC(),

    // 屏幕和视口
    screen: getScreenInfo(),
    viewport: getViewportInfo(),
    isRetina: isRetina(),
    pixelRatio: getPixelRatio(),

    // 网络
    network: getNetworkInfo(),

    // 功能支持
    supportsWebGL: supportsWebGL(),

    // 原始信息
    userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : ''
  };
}

/**
 * 设备方向检测
 * @returns {string} 设备方向 ('portrait' | 'landscape')
 */
export function getOrientation() {
  if (typeof window === 'undefined') return 'portrait';

  if (screen.orientation) {
    return screen.orientation.angle % 180 === 0 ? 'portrait' : 'landscape';
  }

  // 降级方案
  return window.innerHeight > window.innerWidth ? 'portrait' : 'landscape';
}

/**
 * 检测是否为全屏模式
 * @returns {boolean} 是否为全屏模式
 */
export function isFullscreen() {
  if (typeof document === 'undefined') return false;

  return !!(
    document.fullscreenElement ||
    document.mozFullScreenElement ||
    document.webkitFullscreenElement ||
    document.msFullscreenElement
  );
}
